#ifndef LOG_H
#define LOG_H

#include "common_head.h"

/**
 * @brief 日志事件结构体。
 */
typedef struct {
  va_list ap;      /**< 用于存储可变参数列表 */
  char fmt[1024];  /**< 格式化字符串缓存 */
  char file[1024]; /**< 日志事件的文件名 */
  struct tm *time; /**< 日志事件的时间 */
  void *udata;     /**< 用户自定义数据 */
  int line;        /**< 日志事件的行号 */
  int level;      /**< 日志级别 */
} log_Event;

/**
 * @brief 日志回调函数类型定义。
 * @param ev 指向日志事件的指针。
 */
typedef void (*log_LogFn)(log_Event *ev);

/**
 * @brief 锁回调函数类型定义。
 * @param lock 布尔值，表示加锁或解锁。
 * @param udata 用户自定义数据。
 */
typedef void (*log_LockFn)(bool lock, void *udata);

/**
 * @brief 日志级别枚举。
 */
typedef enum { LOG_LEVEL_DEBUG, LOG_LEVEL_INFO, LOG_LEVEL_ERROR } LogLevel;

/**
 * @brief 设置日志锁。
 * @param fn 锁回调函数。
 * @param udata 用户自定义数据。
 */
void log_set_lock(log_LockFn fn, void *udata);

/**
 * @brief 设置日志是否静默。
 * @param enable 布尔值，启用或禁用静默模式。
 */
void log_set_quiet(bool enable);

/**
 * @brief 添加日志回调函数。
 * @param fn 回调函数。
 * @param udata 用户自定义数据。
 * @return 0表示成功，非0表示失败。
 */
int log_add_callback(log_LogFn fn, void *udata);

/**
 * @brief 将日志添加到文件。
 * @param fp 文件指针。
 * @return 0表示成功，非0表示失败。
 */
int log_add_fp(FILE *fp);

/**
 * @brief 设置日志级别。
 * @param level 日志级别。
 */
void log_set_level(LogLevel level);

/**
 * @brief 打印日志。
 * @param level 日志级别。
 * @param sender 发送者标识（"CLIENT" 或 "SERVER"）。
 * @param fmt 格式化字符串。
 * @param ... 可变参数。
 */
void log_log(const char *level, const char *sender, const char *fmt, ...);

/**
 * @brief 打印日志，包含用户信息和数据状态。
 * @param level 日志级别。
 * @param sender 发送者标识（"CLIENT" 或 "SERVER"）。
 * @param user 用户名。
 * @param data 包含命令和参数的数据结构。
 */
void log_log_with_data(const char *level, const char *sender, const char *user,
                       const data *data);

#endif  // LOG_H